package com.jd.tuning.jvm.gc;


/**
 * 可达性算法
 * GCRoots
 * 一个对象即使不可达，也不定被回收
 */
public class GCTest1 {

    private static  GCTest1 obj;


    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("finalize被调用了");
        obj=this;               //finalize 方法重新创建对象的引用
    }


    /**
     * 打印结果
     * finalize被调用了
     * obj可用
     * obj==null
     */
    public static void main(String[] args) throws InterruptedException {
        obj=new GCTest1();
        obj=null;
        //第一次走有必要分支
        System.gc();    //强制回收
        Thread.sleep(1000L);
        if(obj==null){
            System.out.println("obj==null");
        }else{
            System.out.println("obj可用");
        }
        //第二次走无必要分支
        obj=null;               //如果不把obj设置为null，就会导致obj对象永远无法回收
        System.gc();
        Thread.sleep(1000L);
        if(obj==null){
            System.out.println("obj==null");
        }else{
            System.out.println("obj可用");
        }
    }
}
